// import { Injectable } from '@nestjs/common';
// import { getAgent } from './utils/model';
// // import { data } from './utils/data';
// import { initThreadId } from './utils/common';

// @Injectable()
// export class GisService {
//   async chatMessage(body: { chatSessionId: string; messagesList: any[] }) {
//     console.log('body', body);
//     const thread_id = body.chatSessionId || 'gis-session-' + initThreadId();
//     const agent = await getAgent();

//     // 构建系统提示词，包含数据源信息
//     const systemPrompt = `你是一个GIS开发专家，精通各种GIS开发技术。
// 请根据以下数据源回答用户问题：

// 数据字段说明：
// - url: 3D图
// - lng: 空间坐标（经度）
// - lat: 空间坐标（纬度）
// - x: 坐标角度
// - d: 房间号
// - height: 距离地面高度
// - user: 户主

// 请用中文简洁专业地回答用户问题。`;

//     const promptList = body.chatSessionId
//       ? []
//       : [{ type: 'system', content: systemPrompt }];
//     promptList.push(...body.messagesList);

//     const encoder = new TextEncoder();

//     const createSSEData = (data: any): Uint8Array => {
//       return encoder.encode(`data: ${JSON.stringify(data)}\n\n`);
//     };

//     const stream = new ReadableStream({
//       async start(controller) {
//         try {
//           let fullResponse = '';
//           let stepCount = 0;
//           let lastSendTime = Date.now();
//           const TYPING_SPEED_MS = 30; // 打字机速度（毫秒/字符）

//           // 使用 stream 方法进行流式输出
//           const agentStream = await agent.stream(
//             {
//               messages: promptList,
//               enable_thinking: true,
//             },
//             {
//               streamMode: 'messages', // 流式输出 LLM tokens
//               configurable: { thread_id },
//             },
//           );

//           let accumulatedText = '';

//           for await (const chunk of agentStream) {
//             console.log('chunk', chunk);
//             stepCount++;

//             const now = Date.now();

//             // 处理不同类型的流式数据
//             if (Array.isArray(chunk) && chunk.length === 2) {
//               const [messageChunk, metadata] = chunk;

//               if (
//                 messageChunk?.content &&
//                 metadata?.langgraph_node === 'agent'
//               ) {
//                 // 处理不同类型的消息内容
//                 let contentText = '';
//                 if (typeof messageChunk.content === 'string') {
//                   contentText = messageChunk.content;
//                 } else if (Array.isArray(messageChunk.content)) {
//                   // 处理复杂内容数组
//                   contentText = messageChunk.content
//                     .map((item) => {
//                       if (typeof item === 'string') {
//                         return item;
//                       } else if (
//                         item &&
//                         typeof item === 'object' &&
//                         'text' in item
//                       ) {
//                         return item.text;
//                       }
//                       return '';
//                     })
//                     .join('');
//                 }

//                 if (contentText) {
//                   accumulatedText += contentText;
//                   fullResponse += contentText;
//                 }
//               }
//             } else if (
//               chunk &&
//               typeof chunk === 'object' &&
//               'content' in chunk
//             ) {
//               // 直接的内容流
//               let contentText = '';
//               if (typeof chunk.content === 'string') {
//                 contentText = chunk.content;
//               } else if (Array.isArray(chunk.content)) {
//                 contentText = chunk.content
//                   .map((item) => {
//                     if (typeof item === 'string') {
//                       return item;
//                     } else if (
//                       item &&
//                       typeof item === 'object' &&
//                       'text' in item
//                     ) {
//                       return item.text;
//                     }
//                     return '';
//                   })
//                   .join('');
//               }

//               if (contentText) {
//                 accumulatedText += contentText;
//                 fullResponse += contentText;
//               }
//             }

//             // 如果累积了文本，逐字发送
//             if (accumulatedText.length > 0) {
//               // 逐字发送，实现打字机效果
//               const characters = accumulatedText.split('');
//               accumulatedText = ''; // 清空累积文本

//               for (let i = 0; i < characters.length; i++) {
//                 const char = characters[i];

//                 // 发送单个字符
//                 const streamData = {
//                   type: 'token',
//                   text: char,
//                   step: stepCount,
//                   sessionId: thread_id,
//                 };

//                 controller.enqueue(createSSEData(streamData));

//                 // 控制打字速度
//                 if (i < characters.length - 1) {
//                   await new Promise((resolve) =>
//                     setTimeout(resolve, TYPING_SPEED_MS),
//                   );
//                 }
//               }

//               lastSendTime = now;
//             }
//           }

//           // 发送完成信号
//           const finalData = {
//             type: 'done',
//             text: fullResponse,
//             metadata: {
//               source: 'gis_langgraph_stream',
//               sessionId: thread_id,
//               totalSteps: stepCount,
//             },
//           };

//           controller.enqueue(createSSEData(finalData));
//           controller.close();
//         } catch (error) {
//           console.error('流式处理错误:', error);

//           // 获取错误信息
//           let errorMessage = '流式处理失败';

//           if (error instanceof Error) {
//             errorMessage = error.message;
//           }

//           const errorData = {
//             type: 'error',
//             error: errorMessage,
//             sessionId: thread_id,
//           };
//           controller.enqueue(createSSEData(errorData));
//           controller.close();
//         }
//       },
//     });

//     return stream;
//   }

//   // 新增：获取对话历史
//   async getChatHistory(sessionId: string) {
//     const agent = await getAgent();

//     try {
//       // 获取指定会话的对话历史
//       const state = await agent.getState({
//         configurable: {
//           thread_id: sessionId,
//         },
//       });

//       return {
//         code: 200,
//         data: {
//           messages: state.values.messages || [],
//           sessionId: sessionId,
//         },
//       };
//     } catch (error) {
//       console.error('获取对话历史失败:', error);
//       return {
//         code: 500,
//         data: {
//           error: '获取对话历史失败',
//           sessionId: sessionId,
//         },
//       };
//     }
//   }

//   // 新增：清除对话历史
//   async clearChatHistory(sessionId: string) {
//     const agent = await getAgent();

//     try {
//       // 清除指定会话的对话历史
//       await agent.updateState(
//         {
//           configurable: {
//             thread_id: sessionId,
//           },
//         },
//         {
//           messages: [],
//         },
//       );

//       return {
//         code: 200,
//         data: {
//           message: '对话历史已清除',
//           sessionId: sessionId,
//         },
//       };
//     } catch (error) {
//       console.error('清除对话历史失败:', error);
//       return {
//         code: 500,
//         data: {
//           error: '清除对话历史失败',
//           sessionId: sessionId,
//         },
//       };
//     }
//   }
// }
